﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Planning.Classes;

namespace Planning.Forms {
    public partial class inscriptionFormationForm : Form {
        #region Construct
        private DataRow infoAdherent;
        private int idFormation;
        private bool isInscrit;
        
        // Constrcuteur Visiteur
        public inscriptionFormationForm(int idFormation) {
            InitializeComponent();
            // Sauvegarde l'id de la formation
            this.idFormation = idFormation;

            // Récupère les informations de la formation
            DataTable reqForm = SQL.requete("SELECT id_formation, libelle_formation, description_formation, debut_formation, fin_formation, isOuverte, libelle_lieu, description_lieu, cp_lieu, ville_lieu FROM FORMATION, LIEU WHERE FORMATION.id_lieu = LIEU.id_lieu AND id_formation = " + idFormation + ";");
            // Valorise les informations de la formation
            this.libelleFormationText.Text = reqForm.Rows[0]["libelle_formation"].ToString();
            this.descrFormationText.Text = reqForm.Rows[0]["description_formation"].ToString();
            this.labelLieu1.Text = reqForm.Rows[0]["description_lieu"].ToString();
            this.labelLieu2.Text = reqForm.Rows[0]["libelle_lieu"].ToString();
            this.labelLieu3.Text = reqForm.Rows[0]["ville_lieu"].ToString() + " , " + reqForm.Rows[0]["cp_lieu"].ToString();
            this.heureDebut.Value = Convert.ToDateTime(reqForm.Rows[0]["debut_formation"]);
            this.heureFin.Value = Convert.ToDateTime(reqForm.Rows[0]["fin_formation"]);
            this.date1.Value = Convert.ToDateTime(reqForm.Rows[0]["debut_formation"]);
            
            // Vérouille les champs
            this.libelleFormationText.Enabled = false;
            this.descrFormationText.Enabled = false;
            this.heureDebut.Enabled = false;
            this.heureFin.Enabled = false;
            this.date1.Enabled = false;
            this.inscription_button.Enabled = false;
        }

        // Constructeur utilisateur
        public inscriptionFormationForm(int idFormation, DataRow infoAdherent) {
            InitializeComponent();
            // Sauvegarde l'id de la formation et les informations de l'adherent
            this.idFormation = idFormation;
            this.infoAdherent = infoAdherent;

            // Récupère les informations de la formation
            DataTable reqForm = SQL.requete("SELECT id_formation, libelle_formation, description_formation, debut_formation, fin_formation, isOuverte, libelle_lieu, description_lieu, cp_lieu, ville_lieu FROM FORMATION, LIEU WHERE FORMATION.id_lieu = LIEU.id_lieu AND id_formation = "+ idFormation +";");
            // Valorise les informations de la formation
            this.libelleFormationText.Text = reqForm.Rows[0]["libelle_formation"].ToString(); 
            this.descrFormationText.Text = reqForm.Rows[0]["description_formation"].ToString();
            this.labelLieu1.Text = reqForm.Rows[0]["description_lieu"].ToString();
            this.labelLieu2.Text = reqForm.Rows[0]["libelle_lieu"].ToString();
            this.labelLieu3.Text = reqForm.Rows[0]["ville_lieu"].ToString() + " , " + reqForm.Rows[0]["cp_lieu"].ToString();
            this.heureDebut.Value = Convert.ToDateTime(reqForm.Rows[0]["debut_formation"]);
            this.heureFin.Value = Convert.ToDateTime(reqForm.Rows[0]["fin_formation"]);
            this.date1.Value = Convert.ToDateTime(reqForm.Rows[0]["debut_formation"]);

            // Vérouille les champs
            this.libelleFormationText.Enabled = false;
            this.descrFormationText.Enabled = false;
            this.heureDebut.Enabled = false;
            this.heureFin.Enabled = false;
            this.date1.Enabled = false;
            if (!Convert.ToBoolean(reqForm.Rows[0]["isOuverte"]) || date1.Value < DateTime.Now) {
                this.inscription_button.Enabled = false;
            }

            // Compte le nombre d'inscription à la formation du client
            DataTable inscrit = SQL.requete("SELECT COUNT(id_adherent) FROM FORMATION_ADHERENT AS fa WHERE id_formation = " + this.idFormation + " AND id_adherent = " + this.infoAdherent[0] + ";");
            // Si le nombre d'inscription est différent de 0
            this.isInscrit = false;
            if((int)inscrit.Rows[0][0] != 0) {
                // Désactive le bouton d'inscription
                this.isInscrit = true;
                this.inscription_button.Text = "Se désinscrire";  
            }
        }
        #endregion

        #region Clics
        private void button2_Click(object sender, EventArgs e) {
            this.Dispose();
        }

        private void inscription_button_Click(object sender, EventArgs e) {
            // Si déjà inscrit
            if (isInscrit) {
                if (SQL.desinscriptionFormation((int)this.infoAdherent[0], this.idFormation)) {
                    MessageBox.Show("Votre inscription a bien été retirée.");
                    this.Dispose();
                }
                else {
                    MessageBox.Show("Erreur lors de retrait de votre inscription.");
                }
            }
            // Si non inscrit
            else {
                // Compte le nombre d'inscrits et sélectionne le nombre de place dans la formation
                DataTable nbPlace = SQL.requete("SELECT COUNT(fa.id_adherent), f.places_formation FROM FORMATION AS f LEFT JOIN FORMATION_ADHERENT AS fa ON fa.id_formation = f.id_formation WHERE f.id_formation = "+ this.idFormation +" GROUP BY f.places_formation;");
                // Si le nombre de place est different de null
                if(nbPlace.Rows[0][1] != DBNull.Value) {
                    // Si le nombre d'inscrit est inférieur à au nombre de places
                    if (Convert.ToInt32(nbPlace.Rows[0][0]) < Convert.ToInt32(nbPlace.Rows[0][1])) {
                        // Inscrit l'utilisateur à la formation
                        if(SQL.inscriptionFormation((int)this.infoAdherent[0], this.idFormation)) {
                            MessageBox.Show("Votre inscription à bien été prise en compte.");
                            this.Dispose();
                        }
                        else {
                            MessageBox.Show("Erreur lors de l'inscription à la formation.");
                        }
                    }
                    else {
                        MessageBox.Show("Inscription impossible, nombre maximal d'inscrits atteint.");
                    }
                }
                else {
                    // Inscrit l'utilisateur à la formation
                    if (SQL.inscriptionFormation((int)this.infoAdherent[0], this.idFormation)) {
                        MessageBox.Show("Votre inscription à bien été prise en compte.");
                        this.Dispose();
                    }
                    else {
                        MessageBox.Show("Erreur lors de l'inscription à la formation.");
                    }
                }
            }
        }
        #endregion
    }
}
